/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package easyscore;

import java.util.Observable;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Scaredevil
 */
public class Cronometro extends Observable
{

    int tempoAtaque;
    int tempoJogoMin;
    int tempoJogoSeg;
    int tempoTimeout;
    int parte;
    double nextupdate = 0;
    long _startTime;
    long _runTime;
    double _seconds;
    boolean started;
    boolean modoTimeout;
    boolean fimTempoAtaque;
    boolean fimTempoJogo;
    boolean fimTempoTimeout;
    boolean updateAtaque;
    
    public Cronometro() 
    {
        _startTime = System.nanoTime();
        tempoAtaque = 24;
        tempoJogoMin = 10;
        tempoJogoSeg = 0;
        tempoTimeout = 60;
        started = false;
        modoTimeout = false;
        fimTempoAtaque = false;
        fimTempoJogo = false;
        fimTempoTimeout = false;
        updateAtaque = false;
        parte=1;
    }

    public int getTempoAtaque() 
    {
        return tempoAtaque;
    }

    public void setTempoAtaque(int tempoAtaque) 
    {
        this.tempoAtaque = tempoAtaque;
    }

    public int getTempoJogoMin()
    {
        return tempoJogoMin;
    }

    public void setTempoJogoMin(int tempoJogoMin) 
    {
        this.tempoJogoMin = tempoJogoMin;
    }

    public int getTempoJogoSeg()
    {
        return tempoJogoSeg;
    }

    public void setTempoJogoSeg(int tempoJogoSeg) 
    {
        this.tempoJogoSeg = tempoJogoSeg;
    }

    public int getTempoTimeout()
    {
        return tempoTimeout;
    }

    public void setTempoTimeout(int tempoTimeout) 
    {
        this.tempoTimeout = tempoTimeout;
    }
    
    public boolean isStarted() 
    {
        return started;
    }

    public void setStarted(boolean started)
    {
        this.started = started;
    }
    
    public boolean isModoTimeout()
    {
        return modoTimeout;
    }

    public void setModoTimeout(boolean modoTimeout) 
    {
        pause();
        tempoTimeout = 60;
        this.modoTimeout = modoTimeout;
    }
    
     public boolean isFimTempoAtaque() 
    {
        return fimTempoAtaque;
    }

    public void setFimTempoAtaque(boolean fimTempoAtaque) 
    {
        this.fimTempoAtaque = fimTempoAtaque;
    }

    public boolean isFimTempoJogo() 
    {
        return fimTempoJogo;
    }

    public void setFimTempoJogo(boolean fimTempoJogo) 
    {
        this.fimTempoJogo = fimTempoJogo;
    }
    
    public boolean isFimTempoTimeout()
    {
        return fimTempoTimeout;
    }

    public void setFimTempoTimeout(boolean fimTempoTimeout) 
    {
        this.fimTempoTimeout = fimTempoTimeout;
    }

    public void Update(){        
        _runTime = System.nanoTime() - _startTime;
        _seconds = TimeUnit.SECONDS.convert(_runTime, TimeUnit.NANOSECONDS);
        //System.out.println(_seconds + " - " + nextupdate);
        if( _seconds >= nextupdate){
            UpdateTempo();
            UpdateAtaque();
            UpdatePausa();
            nextupdate = _seconds + 1.0;
        }
    }
    
    void UpdateTempo(){
        if(!isStarted())
            return;
        tempoJogoSeg--;
        
        if(tempoJogoMin <= 0 && tempoJogoSeg <=0){
            setStarted(false);
            resetTempoJogo();
            parte++;
            
        }
        
        if(tempoJogoSeg <= 0){
            tempoJogoMin--;
            tempoJogoSeg = 59;
        }
    }
    
    void UpdateAtaque(){
        if(updateAtaque){
            if(tempoAtaque > 0){
            tempoAtaque--; 
            }
        }
    }
    
    void UpdatePausa(){
        if(modoTimeout){
            if(tempoTimeout > 0){
               tempoTimeout--; 
            }
        }
    }
    

    void play() 
    {
        if( !isStarted() )
        {
            updateAtaque = true;
            setStarted(true);            
        }
    }

    void pause() 
    {
        updateAtaque = false;
        //resetTempoAtaque();
        setStarted(false);
    }
    
    void resetTempoAtaque()
    {
        setTempoAtaque(24);
    }
    
    void resetTempoTimeout()
    {
        setTempoTimeout(60);
    }
    
    void resetTempoJogo()
    {
        setTempoJogoMin(10);
        setTempoJogoSeg(0);
    }
    
    void timeout()
    {
        setModoTimeout(true);
    }
    
    void resetFlags()
    {
        setFimTempoAtaque(false);
        setFimTempoJogo(false);
        setFimTempoTimeout(false);
    }
    
    @Override
    public String toString()
    {
        return "Tempo de jogo ->" + getTempoJogoMin() + ":" + getTempoJogoSeg() + " /nTempo de Ataque ->" + getTempoAtaque() + " /nTempo de Timeout ->" + getTempoTimeout();
    }
    
    public int GetParte(){
        return parte;
    }
}
